不知不覺來到了最後一天。
這次的主題是:
Docker 新手村:從容器到 PostgreSQL 的實戰之路
一開始其實只是想學會怎麼使用 Docker 建立 PostgreSQL,並把它應用到自己的專題中。
但一路學下來才發現,Docker 並不只是「把 PostgreSQL 跑起來」這麼簡單。
從最開始的 Image、Container,到後來的 Port、Volume、Network、Dockerfile,再一路進入 PostgreSQL、Node.js 與 Docker Compose,最後才慢慢組成一個完整的開發環境。
一開始先從 Docker 最基本的觀念開始。
Image
↓
Container
Image 可以想成建立 Container 的模板,而 Container 則是真正執行起來的環境。
第一次執行:
docker run hello-world
算是正式踏進 Docker 的第一步。
接著也慢慢熟悉:
docker ps
docker ps -a
docker start
docker stop
docker rm
docker images
docker pull
原本看起來很多的 Docker 指令,實際操作幾次之後就慢慢熟悉了。
接著開始認識 Container 不只是「跑起來」而已。
透過:
-p 8080:80
可以讓自己的電腦存取 Container 中的服務。
透過 Volume:
Container
↓
Volume
↓
資料保存
即使 Container 被刪除,重要資料仍然可以獨立保存。
這對 PostgreSQL 特別重要。
Network 則讓不同 Container 可以互相找到:
Node.js
│
↓
postgres:5432
│
↓
PostgreSQL
也在這裡真正理解 Container 裡的 localhost 指的是自己,而不是其他 Container。
熟悉 Docker 的基本操作後,就開始進入 PostgreSQL。
先使用 Docker 建立:
PostgreSQL Container
接著設定:
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB
並透過 Volume 保存 PostgreSQL 的資料。
之後也開始使用 psql:
docker exec -it my-postgres psql -U postgres
從這裡開始真正進入資料庫操作。
進入 PostgreSQL 後,開始建立:
Database
Table
也實際操作 SQL 最基本的 CRUD:
Create → INSERT
Read → SELECT
Update → UPDATE
Delete → DELETE
接著再把它應用到排班專題中,建立:
employees
schedules
並透過:
Primary Key
Foreign Key
JOIN
讓員工資料與排班資料產生關聯。
這時 PostgreSQL 已經不只是練習用的資料庫,而是真的開始和自己的專題產生連結。
學到後面,原本的 docker run 指令開始變得越來越長。
因此開始使用:
compose.yml
把:
Image
Port
Volume
Environment
Service
全部整理在同一個設定檔中。
原本需要輸入很多 Docker 指令,最後只需要:
docker compose up -d
就可以啟動設定好的服務。
最後再把 Node.js 加進來。
先透過 pg 套件連線 PostgreSQL,再使用 Express 建立 API:
GET /employees
POST /employees
整個資料流程變成:
前端
│
↓
Node.js / Express
│
↓
PostgreSQL
最後再把 Node.js、PostgreSQL 和 pgAdmin 全部放進 Docker Compose。
經過這 30 天,最後完成的架構是:
Docker Compose
│
Docker Network
│
┌───────────┼───────────┐
│ │ │
↓ ↓ ↓
Node.js PostgreSQL pgAdmin
:3000 :5432 :80
│ │ │
└─────────→ │ ←─────────┘
│
↓
Docker Volume
│
↓
PostgreSQL Data
從最開始只有:
docker run hello-world
到現在可以看懂並建立這樣的環境,這也是這 30 天最大的成果。
這次一路接觸了:
Docker
├── Image
├── Container
├── Port
├── Volume
├── Network
├── Dockerfile
└── Docker Compose
PostgreSQL
├── Database
├── Table
├── SQL
├── Primary Key
├── Foreign Key
└── JOIN
Node.js
├── pg
├── Express
├── API
├── Environment Variable
└── PostgreSQL Connection
這些東西單獨看的時候,好像都是不同的技術,但實際做到最後才發現,它們可以全部串在同一個專案裡。
如果重新學一次 Docker,我覺得最重要的不是一開始就背很多指令,而是先搞懂:
Image 是什麼?
Container 是什麼?
Port 為什麼要 Mapping?
Volume 為什麼可以保存資料?
Container 之間怎麼透過 Network 溝通?
這些觀念清楚後,再去看 Docker Compose 就會簡單很多。
因為 Compose 裡面的設定,其實就是把前面學過的東西全部整理在一起。
如果這些都能完成,就代表這 30 天真的沒有白走。
終於完成 30 天了!
一開始決定寫 Docker 的時候,其實對很多觀念都還不是很熟,像是 Image 和 Container 的差別、Volume 到底存在哪裡、為什麼 Container 裡不能一直使用 localhost,都是實際操作後才慢慢理解。
這次最大的收穫不是記住多少 Docker 指令,而是從完全拆開的觀念,一步一步把它們組成真正可以執行的環境。
從 Docker、PostgreSQL 到 Node.js,最後可以用 Docker Compose 一次把整套環境啟動,看到自己的程式成功連上資料庫時,真的會覺得前面學的東西都有串起來。
30 天結束並不代表 Docker 已經全部學完,反而比較像是終於把基礎打好。之後還有部署、Health Check、資料庫備份、效能與正式環境等很多東西可以繼續研究。
但至少現在的我,已經不是 Day 1 那個只知道「Docker 好像可以拿來跑 PostgreSQL」的新手了。
Docker 新手村,畢業!